// 柯里化
// 已知 fn 为一个预定义函数，实现函数 curryIt，调用之后满足如下条件：
// 1、返回一个函数 a，a 的 length 属性值为 1（即显式声明 a 接收一个参数）
// 2、调用 a 之后，返回一个函数 b, b 的 length 属性值为 1
// 3、调用 b 之后，返回一个函数 c, c 的 length 属性值为 1
// 4、调用 c 之后，返回的结果与调用 fn 的返回值一致
// 5、fn 的参数依次为函数 a, b, c 的调用参数

// 考察柯里化 提前接受部分参数，延迟执行，不立即输出结果，而是返回一个接受剩余参数的函数
var fn = function (a, b, c) {
  return a + b + c
};

function curryIt(fn) {
  let args = []
  let len = fn.length // a, b, c 三个参数
  return function next(arg) {
    args.push(arg)
    if (args.length < len) {
      console.log(1111)
      return next
    } else {
      return fn.apply(null, args)
    }
  }
}

// console.log(curryIt(fn)(1)(2)(3));

// curryIt(fn)(1)   //返回的是function (b, c) { return 1 + b + c}